#ifndef __CPPTUTORSOCKET_H__
#define __CPPTUTORSOCKET_H__

#include <string>

using namespace std;

#ifdef WIN32
//windows specific
#else
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <string>
#include <arpa/inet.h>
#endif

const int MAXHOSTNAME       = 200;
const int MAXCONNECTIONS    = 5;
const int MAXRECV           = 500;

class Socket
{
    public:
        Socket();
        virtual ~Socket();

        // Server initialization
        bool socket();
        bool bind ( const int port );
        bool listen() const;
        bool accept ( Socket& ) const;

        // Client initialization
        bool connect ( const std::string host, const int port );

        // Data Transimission
        bool send ( const std::string ) const;
        int recv ( std::string& ) const;

        void set_non_blocking ( const bool );

        bool is_valid() const 
        { 
            return m_sock != -1; 
        }

    private:
        int m_sock;
        #ifdef WIN32
        //windows specific
        #else
        sockaddr_in m_addr;
        #endif
};

#endif //__CPPTUTORSOCKET_H__
